perm filename EQUAT.VLI[VLI,LSP] blob sn#381983 filedate 1978-09-08 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	(status 18 '/! '(lambda () ['var (read)]))
C00004 ENDMK
CāŠ—;
(status 18 '/! '(lambda () ['var (read)]))

(de match (p d ;; aux) (mat p d nil))
(de mat (p d a) (cond
  ((and (null p) (null d)) (or a t))
  ((eq (car p) 'var) 
     (if (setq aux (assq (cadr p) a)) (equal (cadr aux) d)
         (cons [(cadr p) d] a)))
  ((or (null p) (null d)) nil)
  ((atom p) (eq p d))
  ((atom d) (eq p d))
  ((setq aux (mat (car p) (car d) a))
   (mat (cdr p) (cdr d) (if (eq aux t) a aux)))
  ))

(de remp (a e ;; aux) (cond
  ((atom e) e)
  ((eq (car e) 'var) (cadr (assq (cadr e) a)))
  (t (cons (remp a (car e)) (remp a (cdr e))))))

(de foo (x ;; aux) (let ((lp lequat))
  (cond
	((null lp) 'erreur)
        ((findmatch (caar lp) x (cadar lp)))
        (t (self (cdr e)))
  )))

(setqq lequat (
  ((app nil !y) !y)
  ((app (cons !x !y) !z) (cons !x (app !y !z)))
  ))

(de findmatch (p e r ;; aux) 
  (escape exit (maps e '(lambda (x) 
				(if (setq aux (match p x))
			            (exit (rplacb x (remp aux r))))))))

                     
(de bar (e)
  (while (neq 'erreur (setq e (foo e))) (print e)))